lexer grammar samLexer;

options {
  language = Java;
}
@header {
        package traductor;
        }
// -----------------------------------------------------------------------------
// Lexer rules
// -----------------------------------------------------------------------------


@members{
  ArrayList <RecognitionException> errores = new ArrayList<RecognitionException>();
  
  public boolean listaVacia (){
      if (errores.isEmpty()){
        return true;
      }else
        return false;
  }
  
  public ArrayList getListaErrores(){return errores;}
  
  
  @Override
  public void reportError (RecognitionException e){
    System.err.println (getErrorMessage(e, getTokenNames()));
    errores.add(e);
}

}

// Fragments

fragment DIGITO : '0'..'9';
fragment LETRA : ('A'..'Z') | ('a'..'z') | '_';
fragment NUEVA_LINEA : '\r\n' | '\n';
fragment MENOS : '-';

fragment CB : 'CB';
fragment CT : 'CT';
fragment PB : 'PB';
fragment PT : 'PT';
fragment SB : 'SB';
fragment ST : 'ST';
fragment HB : 'HB';
fragment HT : 'HT';
fragment LB : 'LB';
fragment L1 : 'L1';
fragment L2 : 'L2';
fragment L3 : 'L3';
fragment L4 : 'L4';
fragment L5 : 'L5';
fragment L6 : 'L6';
fragment CP : 'CP';

// Tokens

COLON : ':';

OPEN_PAR : '(';
CLOSE_PAR : ')';

OPEN_BRACKET : '[';
CLOSE_BRACKET : ']';

LOAD : 'LOAD';
LOADA : 'LOADA';
LOADI : 'LOADI';
LOADL : 'LOADL';
STORE : 'STORE';
STOREI : 'STOREI';
CALL : 'CALL';
CALLI : 'CALLI';
RETURN : 'RETURN';
PUSH : 'PUSH';
POP : 'POP';
HALT : 'HALT';

REGISTRO
  : CB
  | CT
  | PB
  | PT
  | SB
  | ST
  | HB
  | HT
  | LB
  | L1
  | L2
  | L3
  | L4
  | L5
  | L6
  | CP
  ;
  
ID : LETRA (LETRA | DIGITO)*;
NUMERO : (MENOS)? DIGITO+;

// Misc

BLANCO
  : (' ' | '\t' | NUEVA_LINEA)
  { $channel=HIDDEN; }
  ;